#include <iostream> 
#include <string>   

// 辅助宏：将宏参数转换为字符串字面量
#define STRINGIFY(x) #x
// 辅助宏：先展开宏参数，再将其转换为字符串字面量
#define TOSTRING(x) STRINGIFY(x)

// 根据预处理器宏定义返回包含体系结构信息的字符串
std::string say_hello()
{
    // ARCHITECTURE 宏将由 CMake 定义，其值为处理器体系结构的字符串标识符
    // TOSTRING 宏确保 ARCHITECTURE 的值被正确地转换为字符串字面量
    std::string arch_info(TOSTRING(ARCHITECTURE));
    arch_info += std::string(" architecture. ");

#ifdef IS_32_BIT_ARCH
    // 只有当定义了 IS_32_BIT_ARCH 宏时才编译此分支
    return arch_info + std::string("Compiled on a 32 bit host processor.");
#elif IS_64_BIT_ARCH
    // 只有当定义了 IS_64_BIT_ARCH 宏时才编译此分支
    return arch_info + std::string("Compiled on a 64 bit host processor.");
#else
    // 如果没有定义上述任何宏，则使用通用信息
    return arch_info + std::string("Neither 32 nor 64 bit, puzzling ...");
#endif
}

int main()
{
    // 调用 say_hello 函数并打印结果
    std::cout << say_hello() << std::endl;
    return 0;
}